package club.service.impl;

import club.dao.CommentMapper;
import club.pojo.Answer;
import club.dao.PetMapper;
import club.dao.UserMapper;
import club.pojo.Comment;
import club.pojo.Pet;
import club.pojo.User;
import club.service.AnswerService;
import club.dao.AdminMapper;
import club.pojo.*;
import club.service.CommentService;
import club.service.PetService;
import club.service.UserService;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 评论服务实现类
 * 处理评论的业务逻辑，包括分页查询、创建评论、关联用户/宠物/回复信息等
 */
@Service
@Transactional
// 声明式事务管理，确保数据库操作的原子性

public class CommentServiceImpl implements CommentService {

    @Resource
    private CommentMapper commentMapper;
    // 评论数据访问层

    @Resource
    private UserMapper userMapper;
    // 用户数据访问层

    @Resource
    private PetMapper petMapper;
    // 宠物数据访问层

    @Resource
    private AdminMapper adminMapper;
    // 管理员数据访问层

    @Resource
    private UserService userService;
    // 用户服务层

    @Resource
    private PetService petService;
    // 宠物服务层

    @Resource
    private AnswerService answerService;
    // 回复服务层


    /**
     * 分页查询评论（支持按用户名筛选）
     * @param userName 用户名（模糊匹配）
     * @param pn 页码
     * @param pageSize 每页数量
     * @return 分页结果，包含评论及关联的用户和宠物信息
     */
    @Override
    public PageInfo<Comment> allComment(String userName, Integer pn, Integer pageSize) {
        // 1. 根据用户名模糊查询用户列表
        List<User> users = userService.showName(userName);
        List<Integer> userIds = new ArrayList<>();
        for (User user : users) {
            userIds.add(user.getId());
            // 提取用户ID集合
        }

        // 2. 开启分页并构建查询条件
        PageHelper.startPage(pn, pageSize);
        EntityWrapper<Comment> wrapper = new EntityWrapper<>();
        if (!userIds.isEmpty()) {
            wrapper.in("userId", userIds);
            // 添加用户ID集合查询条件
        }

        // 3. 查询评论列表
        List<Comment> list = commentMapper.selectList(wrapper);

        // 4. 关联用户和宠物信息
        for (Comment comment : list) {
            User u = userMapper.selectById(comment.getUserId());
            // 查询评论用户
            comment.setUser(u);
            // 设置用户信息

            Pet pet = petMapper.selectById(comment.getPetId());
            // 查询被评论的宠物
            comment.setPet(pet);
            // 设置宠物信息
        }

        return new PageInfo<>(list);
        // 封装分页结果
    }

    /**
     * 查询某只宠物的所有评论（包含回复）
     * @param petId 宠物ID
     * @return 评论列表，包含关联的用户、宠物及回复信息
     */
    @Override
    public List<Comment> petComments(Integer petId) {
        // 1. 构建查询条件：根据宠物ID筛选评论
        EntityWrapper<Comment> wrapper = new EntityWrapper<>();
        if (petId != null) {
            wrapper.eq("petId", petId);
            // 添加宠物ID条件
        }

        // 2. 查询评论列表
        List<Comment> comments = commentMapper.selectList(wrapper);

        // 3. 关联用户、宠物及回复信息
        for (Comment comment : comments) {
            User user = userService.findById(comment.getUserId());
            // 查询用户
            comment.setUser(user);
            // 设置用户信息

            Pet pet = petService.findById(comment.getPetId());
            // 查询宠物
            comment.setPet(pet);
            // 设置宠物信息

            List<Answer> answers = answerService.answersAboutOneComment(comment.getId());
            // 查询该评论的所有回复
            comment.setAnswer(answers);
            // 设置回复列表
        }

        return comments;
    }

    /**
     * 创建新评论（普通用户评论宠物）
     * @param userId 用户ID
     * @param petId 宠物ID
     * @param content 评论内容
     * @return 插入成功返回1，失败返回0
     */
    @Override
    public Integer create(Integer userId, Integer petId, String content) {
        // 构建评论对象
        Comment comment = new Comment();
        comment.setUserId(userId);
        // 设置评论用户ID
        comment.setPetId(petId);
        // 设置被评论的宠物ID
        comment.setCommentTime(new Date());
        // 设置评论时间（当前时间）
        comment.setContent(content);
        // 设置评论内容
        return commentMapper.insert(comment);
        // 插入数据库
    }

    /**
     * 根据ID查询评论详情
     * @param id 评论ID
     * @return 评论对象，不存在则返回null
     */
    @Override
    public Comment findById(Integer id) {
        return commentMapper.selectById(id);
        // 调用Mapper根据ID查询
    }

    /**
     * 分页查询所有评论（支持按用户名模糊搜索）
     * @param userName 用户名（模糊匹配）
     * @param pageNum 页码
     * @param pageSize 每页数量
     * @return 分页结果，包含评论及关联的用户、宠物、管理员信息
     */
    @Override
    public PageInfo<Comment> all(String userName, Integer pageNum, Integer pageSize) {
        // 1. 开启分页功能
        PageHelper.startPage(pageNum, pageSize);

        // 2. 构建查询条件：用户名模糊查询
        EntityWrapper<Comment> wrapper = new EntityWrapper<>();
        if (userName != null && !"".equals(userName)) {
            wrapper.like("userName", userName);
            // 添加用户名模糊查询条件
        }

        // 3. 查询评论列表
        List<Comment> list = commentMapper.selectList(wrapper);

        // 4. 关联用户、宠物、管理员信息
        for (Comment a : list) {
            Pet pet = petMapper.selectById(a.getPetId());
            // 查询宠物
            a.setPet(pet);
            // 设置宠物信息

            User user = userMapper.selectById(a.getUserId());
            // 查询用户
            a.setUser(user);
            // 设置用户信息

            Admins admins = adminMapper.selectById(a.getAdminsId());
            // 查询管理员（如果是管理员评论）
            a.setAdmin(admins);
            // 设置管理员信息
        }

        return new PageInfo<>(list);
        // 封装分页结果
    }

    /**
     * 更新评论信息（如修改内容）
     * @param comment 包含更新字段的评论对象（需包含ID）
     * @return 更新成功返回1，失败返回0
     */
    @Override
    public int update(Comment comment) {
        return commentMapper.updateById(comment);
        // 调用Mapper根据ID更新
    }

    /**
     * 根据ID删除评论及关联的回复（需级联删除，当前代码未实现级联，需注意业务逻辑）
     * @param id 评论ID
     * @return 删除成功返回1，失败返回0
     */
    @Override
    public int delete(Integer id) {
        return commentMapper.deleteById(id);
        // 调用Mapper根据ID删除评论（注意：未删除关联的回复，需手动处理）
    }
}